import threading
import time
import os
import json
# from start_api_server2 import start_api_server2_1
from Agent.nodes.boss_node import boss_1
from ansible_python.main import main_1
from ansible_python.Kylin import Kylin_1
from Agent.nodes.report_llm import report_llm_1, generate_report
import config

# 启动API服务（FastAPI）在后台线程
# api_thread = threading.Thread(target=start_api_server2_1, daemon=True)
# api_thread.start()
print("[主控] API服务已启动，监听端口 8001 ...")

def get_latest_result_dir(base_dir):
    """获取ansible-getsystem下最新的结果目录（按日期命名）"""
    dirs = [d for d in os.listdir(base_dir) if os.path.isdir(os.path.join(base_dir, d)) and d.isdigit()]
    if not dirs:
        return None
    return sorted(dirs, reverse=True)[0]

def analyze_before_after_metrics(result_dir):
    """分析最新目录下的before/after文件，返回是否需要执行Kylin_1（目前默认True）"""
    # 读取summary_result.json，找到所有before/after文件
    summary_path = os.path.join(result_dir, 'summary_result.json')
    if not os.path.exists(summary_path):
        print(f"[分析] 未找到 {summary_path}")
        return True  # 默认执行
    try:
        with open(summary_path, 'r', encoding='utf-8') as f:
            summary = json.load(f)
        script_results = summary.get('script_results', [])
        for script in script_results:
            before_path = script.get('local_perf_files', {}).get('before')
            after_path = script.get('local_perf_files', {}).get('after')
            if before_path and after_path and os.path.exists(before_path) and os.path.exists(after_path):
                with open(before_path, 'r', encoding='utf-8') as f1, open(after_path, 'r', encoding='utf-8') as f2:
                    before = json.load(f1)
                    after = json.load(f2)
                # 这里可以添加更复杂的判断逻辑，比如对比CPU、内存等指标
                # 示例：如果after的cpu idle提升，说明有优化
                before_idle = before.get('cpu', {}).get('idle', 0)
                after_idle = after.get('cpu', {}).get('idle', 0)
                print(f"[分析] 脚本: {script.get('script_name')} 优化前idle: {before_idle} 优化后idle: {after_idle}")
        # 目前默认返回True
        return True
    except Exception as e:
        print(f"[分析] 解析性能文件异常: {e}")
        return True

def main_workflow_loop():
    base_dir = os.path.join('ansible_python', 'python', 'ansible-getsystem')
    while True:
        print("\n[主控] === 开始新一轮智能运维流程 ===")
        # 1. Boss节点分析异常
        print("[主控] 调用 boss_1 分析异常...")
        boss_1()
        if config.RESULT:
            print("[主控] boss_1 获取异常数据成功，已POST到API，等待API生成脚本...")
        else:
            print("[主控] boss_1 未获取异常数据，跳过脚本生成...")
            break
        print("[主控] boss_1 分析完成，已POST到API，等待API生成脚本...")
        # 2. 等待API服务处理（可适当sleep，实际可用事件/消息机制优化）
        time.sleep(5)
        # 3. 执行沙盒优化
        print("[主控] 调用 main_1 执行沙盒优化...")
        main_1()
        print("[主控] main_1 执行完成，分析结果...")
        # 4. 分析最新结果目录，判断是否执行Kylin_1
        latest_dir = get_latest_result_dir(base_dir)
        if latest_dir:
            result_dir = os.path.join(base_dir, latest_dir)
            need_kylin = analyze_before_after_metrics(result_dir)
            if need_kylin:
                print("[主控] 满足条件，执行 Kylin_1 ...")
                Kylin_1()
                print("[主控] Kylin_1 执行完成，开始生成大模型分析报告...")
                
                # 生成大模型报告并在控制台打印
                try:
                    report = generate_report()
                    print("\n" + "="*80)
                    print("大模型生成的综合分析报告")
                    print("="*80)
                    print(report)
                    print("="*80)
                    print("[主控] 大模型报告生成完成并已打印到控制台")
                except Exception as e:
                    print(f"[主控] 报告生成失败: {e}")
            else:
                print("[主控] 不满足条件，跳过 Kylin_1 ...")
        else:
            print("[主控] 未找到最新结果目录，跳过 Kylin_1 ...")
        # 5. 休眠后进入下一轮
        print("[主控] 本轮流程结束，等待10秒进入下一轮 ...")
        time.sleep(30)

if __name__ == "__main__":
    main_workflow_loop()
